package com.kukudexin;

import java.util.Date;

/**
 * @author: 酷酷的鑫
 * @Date: 2021/12/8 10:57
 * @description:
 */
public class Test03 {
    public static void main(String[] args) {
        Gen<Integer> obj1 = new Gen<>(123);
        obj1.showType();
        Integer data = obj1.getData();//getData()方法返回泛型指定的Integer对象
        Gen<String> obj2 = new Gen<>("456");
        obj2.showType();
        String str = obj2.getData();
        Gen obj4 = new Gen(new Date() );
        obj4.showType();
        Object obj4Data = obj4.getData();

        String txt = (String) obj4Data; //ClassCastException  java.util.Date cannot be cast to java.lang.String

        /**
         * 编译没有语法错误，因为编译器不知道obj4Data实际引用的数据类型。但是会产生运行时异常。
         */


    }
    //演示定义一个泛型类, 在类名后面使用<>尖括号来定义泛型
    static class  Gen<T>{       //T就是类型参数名称,就是一个占位符,在创建Gen类对象时,可以使用任意的引用类型替换它
        //使用类型T定义实例变量
        T data;     //data的类型就是在创建Gen对象时给T传递的类型

        //定义构造方法给data实例变量初始化 ,给构造方法传递一个T类型的数据,
        public  Gen( T data){
            this.data = data;
        }

        //使用T参数类型作为方法返回值类型
        public T getData(){
            return data;
        }

        //定义方法可以显示T类型
        public void showType(){
            System.out.println( "T类型是:" + data.getClass().getSimpleName() );
        }
    }
}
